---@class UI
---@field UIConfig table UI配置信息
---@field UIStack table 进栈UI
---@field UIAll table 所有的ＵＩ
UI={UIConfig={},UIStack ={},UIAll = {}}

--栈UI索引
UI.pIndex=0

--获取栈顶UI
function UI.GetTop()
    if UI.UIStack[UI.pIndex]~=nil then
        return UI.UIStack[UI.pIndex]
    end
    return nil
end
---@param Widget UE4.ULuaUserWidget 用户界面
--UI入栈
function UI.Push(Widget)
    if Widget~=nil then
        UI.UIStack[UI.pIndex+1]=Widget
        UI.pIndex=UI.pIndex+1
    end
end

--UI出栈
function UI.Pop ()
    if UI.GetTop~=nil then

        UI.UIStack[UI.pIndex]=nil
        UI.pIndex=UI.pIndex-1
    end
end


--@创建UI
---@param Wlord self 创建者
---@param Name string UI的名字
function UI.OpenUI(Wlord,Name)
    --判定是不是为空
    if Wlord==nil then
        return
    end

    --判断是不是已经打开
    if UI.UIAll[Name]~=nil then
        print("UI 已经打开")
        return
    end

    --设置UI路径
    local WidgetClass=UI.UIConfig[Name].WidgetClass.AssetPathName
    --UI层级
    local WidgetLevel=UI.UIConfig[Name].Level
    --判断是不是关闭其他所有的UI
    local IsCloseAll=UI.UIConfig[Name].IsCloseAll
    --判断是否入栈
    local IsStack=UI.UIConfig[Name].IsStack
    
    --创建UI
    local Widget=UE4.UWidgetBlueprintLibrary.Create(Wlord,UE4.UClass.Load(WidgetClass))
    Widget.sName=Name
    --保存UI到数组中
    UI.UIAll[Name]=Widget

    --判定UI是不是入栈
    if IsStack then
        --界面入栈
        UI.Push(Widget)
        --移除上一个ＵＩ
        if UI.UIStack[UI.pIndex-1]~=nil then
            UI.UIStack[UI.pIndex-1]:RemoveFromParent()
        end
    end
    Widget:AddToViewport(WidgetLevel)
    UE4.UUMGLibrary.AddToRoot(Widget)
    return Widget
end

--关闭ＵＩ
---@param Name any UI的名字
function UI.CloseUI(Name)
    if UI.UIAll[Name]==nil then
        return
    end
    --判断是否入栈
    local IsStack=UI.UIConfig[Name].IsStack
    if IsStack then
        --出栈
        UI.Pop()
        if UI.GetTop()~=nil then
            UI.GetTop():AddToViewport()
        end

    end
    
    UI.UIAll[Name]:RemoveFromParent()
    UE4.UUMGLibrary.RemoveFormRoot(UI.UIAll[Name])
    UI.UIAll[Name]=nil
end

--卸载所有UI
function UI.Uninstall()
    if UI.UIAll==nil then
        return
    end
    for _, value in pairs(UI.UIAll) do
        UE4.UUMGLibrary.RemoveFormRoot(value)
        value=nil
    end
    
end

--关闭所有的UI
function UI.CloseAllUI()
    for _, value in pairs(UI.UIAll) do
        value:RemoveFromParent();
        UE4.UUMGLibrary.RemoveFormRoot(value)
        UI.UIAll[value.sName]=nil
    end
    for i, value in pairs(UI.UIStack) do
        UI.UIStack[i]=nil
    end
    UI.pIndex=0
end

---@param UIName Name UI的名字
---获取UI
function UI.GetUI(UIName)
    if UI.UIAll[UIName]~=nil then
        local widget=UI.UIAll[UIName]
        return widget
    end
    print("12")
end


--初始化UI配置信息
function UI.LoadConfig()
    local config= UE4.TMap(UE4.FString,UE4.FUIConfig)
    UE4.UUMGLibrary.LoadUIConfig(config)
    local key=config:Keys()
    for i=1,key:Length() do
        local sName=string.lower(key:Get(i))
        UI.UIConfig[sName]=config:Find(key:Get(i))
    end
    print("UI配置表读取成功") 
end

--开始加载配置
UI.LoadConfig()

--return UI